package com.yfp.operation.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yfp.operation.domain.ClientCoupon;
import com.yfp.operation.domain.MarCoupon;
import com.yfp.operation.domain.dto.AcquireCouponDTO;
import com.yfp.operation.domain.dto.ParticipationDTO;
import com.yfp.operation.domain.vo.*;
import com.yfp.operation.domain.vo.*;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 *
 * @description 针对表【client_coupon(客户优惠券)】的数据库操作Mapper
 * @createDate 2024-07-12 15:49:29
 * @Entity domain.com.yfp.operation.ClientCoupon
 */
public interface ClientCouponMapper extends BaseMapper<ClientCoupon> {

    /**
     * 获取优惠券使用情况
     *
     * @param couponIds
     * @return
     */
    List<CouponCountVO> getCount(@Param("couponIds") List<Long> couponIds);

    /**
     * 获取优惠情况
     *
     * @param couponIds
     * @return
     */
    List<CouponDetailVO> detail(@Param("couponIds") List<Long> couponIds);

    /**
     * 获取优惠情况(折扣)
     *
     * @param couponIds
     * @return
     */
    List<CouponDetailVO> discount(@Param("couponIds") List<Long> couponIds);

    /**
     * 获取用户优惠券列表
     *
     * @param userId
     * @return
     */
    List<ClientCoupon> getClientCouponListByUserIdAndStatus(@Param("userId") Long userId, @Param("status") Integer status);

    /**
     * 根据优惠券id获取领取该优惠券的用户id
     *
     * @param couponId
     * @return
     */
    List<String> getClientId(@Param("couponId") Long couponId, @Param("status") Integer status);

    /**
     * 修改状态
     *
     * @param couponId
     * @param status
     */
    void updateStatus(@Param("couponId") Long couponId, @Param("status") Integer status);

    /**
     * 获取订单号
     *
     * @param couponId
     * @return
     */
    List<String> getOrderId(Integer couponId);

    List<AcquireListVO> acquireCouponList(AcquireCouponDTO acquireCouponDTO);

    void grant(@Param("clientIds") List<String> clientIds, @Param("cc") ClientCoupon cc);

    /**
     * 获取优惠券数量大于可领取数量的用户  即不能领取的id
     * @param clientIds
     * @param receiveCount
     * @param couponId
     * @return
     */
    List<String> clientId(@Param("clientIds") List<String> clientIds, @Param("receiveCount") Integer receiveCount, @Param("couponId") Long couponId);

    /**
     * 修改状态
     *
     * @param id
     * @param status
     */
    void updateStatusById(@Param("id") Long id, @Param("status") Integer status);

    /**
     * 导出详情
     *
     * @param acquireCouponDTO
     * @return
     */
    List<DeriveDetailVO> deriveDetail(AcquireCouponDTO acquireCouponDTO);

    /**
     * 调用存储过程
     *
     * <pre>{@code
     * CREATE PROCEDURE "public"."update_client_coupon_status"()
     *  AS $BODY$
     * DECLARE
     *     current_time_222 TIMESTAMP;
     * BEGIN
     *     -- 获取当前时间
     *     current_time_222 := NOW();
     *     -- 更新状态为1的优惠券，如果valid_end_time加上postpone_day小于当前时间，更新status为3
     *     UPDATE client_coupon
     *     SET status = 3
     *     WHERE status = 1
     *       AND add_days_to_timestamp(valid_end_time, postpone_day) < current_time_222;
     *
     *     -- 更新状态为4的优惠券，如果start_time大于等于当前时间且当前时间小于等于end_time，更新status为1
     *     UPDATE client_coupon
     *     SET status = 1
     *     WHERE status = 4
     *       AND current_time_222 >= valid_start_time
     *       AND current_time_222 <= valid_end_time;
     * END;
     * $BODY$
     *   LANGUAGE plpgsql
     * }</pre>
     */
    // @Select("call update_client_coupon_status()")
    void callUpdateClientCouponStatus();

    /**
     * 失效
     *
     * @param couponId
     * @param status
     */
    void invalidByCouponId(@Param("couponId") Long couponId, @Param("status") Integer status);

    /**
     * 失效
     *
     * @param clientCouponId
     * @param status
     */
    void invalid(@Param("clientCouponId") Long clientCouponId, @Param("status") Integer status);

    /**
     * 延长时间
     *
     * @param list
     */
    void lengthen(@Param("list") List<MarCoupon> list);

    /**
     * 统计单券
     *
     * @param clientId
     * @param couponId
     * @return
     */
    Integer countByClientIdAndCouponId(@Param("clientId") String clientId, @Param("couponId") Long couponId);

    /**
     * 查看参加活动获得奖励
     *
     * @param participationDTO
     * @return
     */
    List<ClientCoupon> findActivityAward(ParticipationDTO participationDTO);

    /**
     * 领取数量
     *
     * @param directionalList
     * @param couponId
     * @return
     */
    List<ClientCouponNumVO> getCouponNum(@Param("directionalList") List<MarCouponDirectionalVO> directionalList, @Param("couponId") Long couponId);

    /**
     * 获取用户领券数量
     *
     * @param clientId
     * @param id
     * @return
     */
    Integer acquireNum(@Param("clientId") String clientId, @Param("id") Long id);

    /**
     * 添加
     *
     * @param userId
     * @param cc
     */
    void add(@Param("userId") String userId, @Param("cc") ClientCoupon cc);

    /**
     * 根据礼包id和用户id查询优惠券
     *
     * @param couponPackId
     * @param clientIds
     * @return
     */
    List<ClientCoupon> selectByCouponPackIdAndClientIds(@Param("couponPackId") Long couponPackId, @Param("clientIds") List<String> clientIds);

    /**
     * 储值优惠券失效
     * @param cbId
     */
    void storedCouponExpire(Long cbId);
}




